1 // 4808 from Live Archive
24 #define foreach(x, v) for (typeof (v).begin() x=(v).begin(); x !=(v).end(); ++x)
25 #define For(i, a, b) for (int i=(a); i<(b); ++i)
26 #define D(x) cout << #x " is " << x << endl
31 void print(const vector
<int> &v
) {
32 for (int i
= 0; i
< v
.size(); ++i
) {
33 if (i
> 0) printf(" ");
42 while (e
--) ans
*= 10;
49 for (int k
= i
; k
>= 0; --k
) {
50 ans
= 10 * ans
+ num
[k
];
55 vector
<int> memo
[10][2];
57 vector
<int> f(int i
, bool m
) {
59 return vector
<int>(10, 0);
62 if (memo
[i
][m
].size() > 0) return memo
[i
][m
];
64 vector
<int> ans(10, 0);
66 int limit
= (m
? 9 : num
[i
] - 1);
67 for (int k
= 0; k
<= limit
; ++k
) {
68 vector
<int> s
= f(i
- 1, true);
70 for (int j
= 0; j
< 10; ++j
) ans
[j
] += s
[j
];
74 vector
<int> s
= f(i
- 1, false);
75 s
[num
[i
]] += assemble(i
- 1) + 1;
76 for (int j
= 0; j
< 10; ++j
) ans
[j
] += s
[j
];
82 vector
<int> f(int x
) {
84 while (x
> 0) num
.push_back(x
% 10), x
/= 10;
85 for (int i
= 0; i
<= 10; ++i
) {
86 memo
[i
][0].clear(), memo
[i
][1].clear();
88 vector
<int> ans
= f(num
.size() - 1, false);
89 ans
[0] -= (ten(num
.size()) - 1) / 9;
90 // for (int i = num.size() - 1; i >= 0; --i) {
91 // assert(ans[0] >= ten(i));
97 void bruteforce(int a
) {
98 vector
<int> ans(10, 0);
99 for (int i
= 1; i
<= a
; ++i
){
101 while (x
> 0) ans
[x
% 10]++, x
/= 10;
103 printf("Bruteforced answer for i=%d: ", a
);
108 // vector<int> a = f(1);
110 // for (int i = 1; i <= 100; ++i) {
111 // printf("i = %d: ", i);
115 while (cin
>> a
>> b
) {
116 if (a
== 0 and b
== 0) break;
117 if (a
> b
) swap(a
, b
);
118 vector
<int> ans
= f(b
);
120 vector
<int> remove
= f(a
- 1);
121 for (int i
= 0; i
< 10; ++i
) ans
[i
] -= remove
[i
];
123 //if (a - 1 > 0) { printf("f(%d) = ", a - 1); print(f(a - 1)); }
124 //printf("f(%d) = ", b); print(f(b));